#include "stdafx.h"
#include "GameGraphicsController.h"


GameGraphicsController::GameGraphicsController(void) : mRoot(0)
{
}


GameGraphicsController::~GameGraphicsController(void)
{
	delete mRoot;
}


bool	GameGraphicsController::Start(void)
{
	// Choisit les fichiers de conf de debug ou de release
	#ifdef _DEBUG
    std::string mResourcesCfg = "resources_d.cfg";
    std::string mPluginsCfg = "plugins_d.cfg";
	#else
	std::string mResourcesCfg = "resources.cfg";
	std::string mPluginsCfg = "plugins.cfg";
	#endif

	// Creation de l'objet de base de Ogre
	mRoot = new Ogre::Root(mPluginsCfg, "ogre.cfg", "Ogre.log");

	// Repertorie toutes les ressources necessaires (images, meshes, materials)
	Ogre::ConfigFile configFile;
	configFile.load(mResourcesCfg);

	Ogre::ConfigFile::SectionIterator seci = configFile.getSectionIterator();
	
	Ogre::String secName, typeName, archName;

	while (seci.hasMoreElements())
	{
		secName = seci.peekNextKey();
		Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
		Ogre::ConfigFile::SettingsMultiMap::iterator i;

		for (i = settings->begin(); i != settings->end(); ++i)
		{
			typeName = i->first;
			archName = i->second;
			Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
		}
	}

	// Verifie qu'une configuration pour Ogre est bien presente, si non alors il ouvre la boite de dialogue
	if (!(mRoot->restoreConfig() || mRoot->showConfigDialog()))
	{
		return false;
	}



	// Creation de la fenetre
	mWindow = mRoot->initialise(true, "The Hunter");

	// Demande a Ogre de creer dynamiquement 5 niveaux de textures de differentes qualite(MipMaps)
	Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);

	// Demande a Ogre de charger toutes les ressources (possibilite d'utiliser des groupes pour ne pas tout charger en meme temps)
	Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

	// Le SM gere tout ce que concerne les entites et donc les mesh entre autre
	mSceneMgr = mRoot->createSceneManager("DefaultSceneManager");

	// Creation de la camera
	mCamera = mSceneMgr->createCamera("PlayerCam");
	mCamera->setPosition(Ogre::Vector3(250, 10, 0));
	mCamera->lookAt(Ogre::Vector3(0, 10, 0));
	mCamera->setNearClipDistance(5);

	// Viewport de la scene, on defini son echelle a celui de la camera
	Ogre::Viewport* vp = mWindow->addViewport(mCamera);
	vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
	mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));

	// Creation du Frame Listener pour gerer les Inputs et la Logique de jeu
	CreateFrameListener();

	// Lance la boucle de rendu
	mRoot->startRendering();

	return false;
}

void	GameGraphicsController::CreateFrameListener()
{
	mInputListener = new GameInputListener(mWindow, mCamera, mSceneMgr);
    mRoot->addFrameListener(mInputListener);
}